﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Promocot.Models;

namespace Promocot.Controllers
{
    public class AdministracionController : Controller
    {
        //
        // GET: /Administracion/
        ClientomaticDBContainer almacen = new ClientomaticDBContainer();

        public ActionResult Index()
        {
            if ((int)Session["rol"] != 2) { return RedirectToAction("Index", "Home"); }
            List<Usuario> usuarios = new List<Usuario>();
            Session.Add("accion", " ");
            ViewBag.plantillas = almacen.CotizacionSet.Where(cot => !cot.eliminado && cot.status.Equals(Status.plantilla) && cot.fecha.Day == DateTime.Now.Day && cot.fecha.Month == DateTime.Now.Month && cot.fecha.Year == DateTime.Now.Year && cot.Usuario.activo).ToList<Cotizacion>();
            ViewBag.cotizaciones = almacen.CotizacionSet.Where(cot => !cot.eliminado && !cot.status.Equals(Status.plantilla) && cot.fecha.Day == DateTime.Now.Day && cot.fecha.Month == DateTime.Now.Month && cot.fecha.Year == DateTime.Now.Year && cot.Usuario.activo).ToList<Cotizacion>();

            return View(usuarios);
        }

        public ActionResult filtros()
        {
            ViewBag.destinos = almacen.DestinoSet.ToList<Destino>();
            ViewBag.temporadas = almacen.TemporadaSet.ToList<Temporada>();
            Usuario nuevo = new Usuario
            {
                nombre = "Todos"
            };
            List<Usuario> usuarios = almacen.UsuarioSet.ToList<Usuario>();
            usuarios.Add(nuevo);
            ViewBag.asesores = usuarios;

            return PartialView();
        }

        public ActionResult asesores()
        {
            Session.Add("accion", "asesores");
            int idempresa = (int)Session["empresaID"];
            List<Usuario> usuarios = almacen.UsuarioSet.Where(usu => usu.cod_empresa == idempresa).ToList<Usuario>();
            return View(usuarios);
        }

        public ActionResult ReporteAsesor(Int32 id)
        {
            Session.Add("accion", "ReporteAsesor");
            Session.Add("idAsesor", id);
            return View(almacen.UsuarioSet.Where(usu => usu.cod_usuario == id).Single<Usuario>());
        }

        public ActionResult Plantillas()
        {
            Session.Add("accion", "Plantillas");
            ViewBag.destinos = almacen.DestinoSet.ToList<Destino>();
            ViewBag.temporadas = almacen.TemporadaSet.ToList<Temporada>();
            List<Cotizacion> plantillas = almacen.CotizacionSet.Where(cot => cot.status.Equals(Status.plantilla) && !cot.eliminado && cot.Usuario.activo).OrderByDescending(cot => cot.Id).ToList<Cotizacion>();
            return View("MostrarCotizacionesPlantilla", plantillas);
        }

        public ActionResult Cotizaciones()
        {
            Session.Add("accion", "Cotizaciones");
            List<Cotizacion> cotizaciones = almacen.CotizacionSet.Where(cot => !cot.status.Equals(Status.plantilla) && !cot.eliminado && cot.Usuario.activo).OrderByDescending(cot => cot.Id).ToList<Cotizacion>();
            return View("MostrarCotizaciones", cotizaciones);
        }

        public ActionResult filtrarPlantillas(FormCollection form)
        {


            List<Cotizacion> plantillas = almacen.CotizacionSet.Where(cot => cot.status.Equals(Status.plantilla) && !cot.eliminado && cot.Usuario.activo).OrderByDescending(cot => cot.Id).ToList<Cotizacion>();

            if (!String.IsNullOrEmpty(form.Get("destino")))
            {
                int iddestino = int.Parse(form.Get("destino"));
                foreach (var cot in plantillas.Where(cot=> cot.Usuario.activo).ToList<Cotizacion>())
                {
                    if (cot.Destino.Id != iddestino)
                    {
                        plantillas.Remove(cot);
                    }
                }
            }

            if (!String.IsNullOrEmpty(form.Get("temporada")))
            {
                int idtemporada = int.Parse(form.Get("temporada"));
                foreach (var cot in plantillas.ToList<Cotizacion>())
                {
                    if (cot.Temporada.Id != idtemporada)
                    {
                        plantillas.Remove(cot);
                    }
                }
            }

            if (!String.IsNullOrEmpty(form.Get("titulo")))
            {

                foreach (var cot in plantillas.ToList<Cotizacion>())
                {
                    if (!cot.titulo_cotizacion.Contains(form.Get("titulo")))
                    {
                        plantillas.Remove(cot);
                    }
                }
            }

            return View("MostrarCotizacionesPlantilla", plantillas);
        }

        public ActionResult filtrarCotizaciones(FormCollection form)
        {
            List<Cotizacion> cotizaciones = almacen.CotizacionSet.Where(cot => !cot.status.Equals(Status.plantilla) && !cot.eliminado && cot.Usuario.activo).OrderByDescending(cot => cot.Id).ToList<Cotizacion>();

            if (!String.IsNullOrEmpty(form.Get("asesores")))
            {
                int idusuario = int.Parse(form.Get("asesores"));
                if (idusuario != 0)
                {
                    foreach (var cot in cotizaciones.ToList<Cotizacion>())
                    {
                        if (cot.Usuario.cod_usuario != idusuario)
                        {
                            cotizaciones.Remove(cot);
                        }
                    }
                }
            }


            if (!String.IsNullOrEmpty(form.Get("titulo")))
            {

                foreach (var cot in cotizaciones.ToList<Cotizacion>())
                {
                    if (!cot.titulo_cotizacion.Contains(form.Get("titulo")))
                    {
                        cotizaciones.Remove(cot);
                    }
                }
            }

            if (!String.IsNullOrEmpty(form.Get("status")))
            {

                foreach (var cot in cotizaciones.ToList<Cotizacion>())
                {
                    if (!cot.status.Equals(form.Get("status")))
                    {
                        cotizaciones.Remove(cot);
                    }
                }
            }

            if (!String.IsNullOrEmpty(form.Get("in")) && !String.IsNullOrEmpty(form.Get("out")))
            {

                DateTime fecha_in = DateTime.Parse(form.Get("in"));
                DateTime fecha_out = DateTime.Parse(form.Get("out"));

                if (!String.IsNullOrEmpty(form.Get("opcion")))
                {
                    if (form.Get("opcion") == "emision")
                    {

                        foreach (var cot in cotizaciones.ToList<Cotizacion>())
                        {
                            if (!(cot.fecha >= fecha_in && cot.fecha <= fecha_out))
                            {
                                cotizaciones.Remove(cot);
                            }

                        }

                    }
                    else
                    {

                        foreach (var cot in cotizaciones.ToList<Cotizacion>())
                        {
                            if ((fecha_in <= cot.fecha_inicio && fecha_out <= cot.fecha_inicio) || (fecha_in >= cot.fecha_fin && fecha_out >= cot.fecha_fin))
                            {
                                cotizaciones.Remove(cot);
                            }

                        }
                    }

                }

                return View("MostrarCotizaciones", cotizaciones);
            }



            /*Ahora hago el manejo de fechas con todo lo que haga falta*/
            if (!String.IsNullOrEmpty(form.Get("in")))
            {
                DateTime fecha_in = DateTime.Parse(form.Get("in"));
                if (!String.IsNullOrEmpty(form.Get("opcion")))
                {
                    if (form.Get("opcion") == "emision")
                    {
                        foreach (var cot in cotizaciones.ToList<Cotizacion>())
                        {
                            if (!(cot.fecha.ToShortDateString() == fecha_in.ToShortDateString()))
                            {
                                cotizaciones.Remove(cot);
                            }

                        }
                    }
                    else
                    {
                        foreach (var cot in cotizaciones.ToList<Cotizacion>())
                        {

                            String fecha = cot.fecha_inicio != null ? cot.fecha_inicio.Value.ToString("dd/MM/yyyy") : "n/a";
                            if (!(fecha == fecha_in.ToShortDateString()))
                            {
                                cotizaciones.Remove(cot);
                            }

                        }

                    }

                }

            }


            if (!String.IsNullOrEmpty(form.Get("out")))
            {
                DateTime fecha_in = DateTime.Parse(form.Get("out"));
                if (!String.IsNullOrEmpty(form.Get("opcion")))
                {
                    if (form.Get("opcion") == "emision")
                    {
                        foreach (var cot in cotizaciones.ToList<Cotizacion>())
                        {
                            if (!(cot.fecha.ToShortDateString() == fecha_in.ToShortDateString()))
                            {
                                cotizaciones.Remove(cot);
                            }

                        }
                    }
                    else
                    {
                        foreach (var cot in cotizaciones.ToList<Cotizacion>())
                        {

                            String fecha = cot.fecha_inicio != null ? cot.fecha_inicio.Value.ToString("dd/MM/yyyy") : "n/a";
                            if (!(fecha == fecha_in.ToShortDateString()))
                            {
                                cotizaciones.Remove(cot);
                            }

                        }

                    }

                }

            }

            return PartialView("MostrarCotizaciones", cotizaciones);
        }

        public ActionResult filtrartitulo(FormCollection form)
        {
            List<Cotizacion> plantillas = almacen.CotizacionSet.Where(cot => cot.status.Equals(Status.plantilla) && !cot.eliminado && cot.Usuario.activo).OrderByDescending(cot => cot.Id).ToList<Cotizacion>();

            if (!String.IsNullOrEmpty(form.Get("titulo")))
            {

                foreach (var cot in plantillas.ToList<Cotizacion>())
                {
                    if (!(cot.titulo_cotizacion.IndexOf(form.Get("titulo"),StringComparison.OrdinalIgnoreCase) >= 0))
                    {
                        plantillas.Remove(cot);
                    }
                }
            }

            return View("MostrarCotizacionesPlantilla", plantillas);
        }

        public ActionResult FiltrarId(FormCollection form)
        {
            int elId = int.Parse(form.Get("id"));
            List<Cotizacion> nuevaCot = new List<Cotizacion>();
            Cotizacion actual = almacen.CotizacionSet.Where(cot => cot.Id == elId && !cot.eliminado && cot.Usuario.activo).FirstOrDefault<Cotizacion>();
            if (actual != null)
            {
                nuevaCot.Add(actual);
            }
            else
            {
                return View("MostrarCotizaciones", nuevaCot);
            }

            if (!actual.status.Equals(Status.plantilla))
            {

                return View("MostrarCotizaciones", nuevaCot);
            }
            else
            {
                return View("MostrarCotizacionesPlantilla", nuevaCot);
            }

        }

        public ActionResult filtrarFechas(FormCollection form)
        {
            List<Usuario> todos_usuarios = almacen.UsuarioSet.ToList<Usuario>();
            List<Usuario> filtrados = new List<Usuario>();

            if (!String.IsNullOrEmpty(form.Get("in")) && !String.IsNullOrEmpty(form.Get("out")))
            {

                DateTime fecha_in = DateTime.Parse(form.Get("in"));
                DateTime fecha_out = DateTime.Parse(form.Get("out"));

                if (!String.IsNullOrEmpty(form.Get("opcion")))
                {
                    if (form.Get("opcion") == "emision")
                    {

                        foreach (var usuario in todos_usuarios.Where(cot=> cot.activo).ToList<Usuario>())
                        {
                            foreach(var cot in usuario.Cotizacion.ToList<Cotizacion>())
                            {
                                if (!(cot.fecha >= fecha_in && cot.fecha <= fecha_out))
                                {
                                    usuario.Cotizacion.Remove(cot);
                                }
                            }
                        }

                    }
                    else
                    {
                        foreach (var usuario in todos_usuarios.Where(cot => cot.activo).ToList<Usuario>())
                        {
                            foreach (var cot in usuario.Cotizacion.ToList<Cotizacion>())
                            {
                                if ((fecha_in <= cot.fecha_inicio && fecha_out <= cot.fecha_inicio) || (fecha_in >= cot.fecha_fin && fecha_out >= cot.fecha_fin))
                                {
                                    usuario.Cotizacion.Remove(cot);
                                }

                            }
                        }
                    }

                }

                return View("asesores", todos_usuarios);
            }

            return View("asesores", todos_usuarios);
        }

        public ActionResult filtrarAsesor(FormCollection form)
        {

            int idAsesor = int.Parse(form.Get("idasesor"));

            Usuario actual = almacen.UsuarioSet.Where(usu => usu.cod_usuario == idAsesor).Single<Usuario>();


            if (!String.IsNullOrEmpty(form.Get("in")) && !String.IsNullOrEmpty(form.Get("out")))
            {

                DateTime fecha_in = DateTime.Parse(form.Get("in"));
                DateTime fecha_out = DateTime.Parse(form.Get("out"));

                if (!String.IsNullOrEmpty(form.Get("opcion")))
                {
                    if (form.Get("opcion") == "emision")
                    {

                        foreach (var cot in actual.Cotizacion.ToList<Cotizacion>())
                        {
                            if (!(cot.fecha >= fecha_in && cot.fecha <= fecha_out))
                            {
                                actual.Cotizacion.Remove(cot);
                            }

                        }

                    }
                    else
                    {

                        foreach (var cot in actual.Cotizacion.ToList<Cotizacion>())
                        {
                            if ((fecha_in <= cot.fecha_inicio && fecha_out <= cot.fecha_inicio) || (fecha_in >= cot.fecha_fin && fecha_out >= cot.fecha_fin))
                            {
                                actual.Cotizacion.Remove(cot);
                            }

                        }
                    }

                }

                return PartialView("ReporteAsesor", actual);
            }


            return PartialView("ReporteAsesor", actual);
        }

        public ActionResult Destinos()
        {
            Session.Add("accion", "Destinos");
            List<Destino> listaDestino = almacen.DestinoSet.OrderBy(a=>a.num_destino).ToList<Destino>();
            return View(listaDestino);
        }

        public ActionResult NuevoDes()
        {
            Destino nuevo = new Destino();
            return View(nuevo);
        }

        public ActionResult EditarDes(Int32 id)
        {
            return View("NuevoDes", almacen.DestinoSet.Where(des => des.Id == id).Single<Destino>());
        }

        [HttpPost]
        public ActionResult CrearDestino(Destino actual)
        {
            int idempresa = (int)Session["empresaID"];
            
            if (actual.Id == 0)
            {
                actual.Empresa = almacen.EmpresaSet.Single(mod => mod.cod_empresa == idempresa);
                almacen.DestinoSet.AddObject(actual);
                almacen.SaveChanges();
            }
            else
            {
                Destino destiny = almacen.DestinoSet.Single(des => des.Id == actual.Id);
                if (TryUpdateModel(destiny))
                {
                    almacen.SaveChanges();
                }
            }

            return RedirectToAction("Destinos");
        }

        public ActionResult Eliminar(Int32 id)
        {

            Cotizacion findit = almacen.CotizacionSet.Where(cot => cot.Id == id).Single<Cotizacion>();
            findit.eliminado = true;
            almacen.SaveChanges();
            return RedirectToAction("Cotizaciones", "Administracion");
        }
    }
}
